package com.cxf.windex.base.util;

import java.util.Iterator;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.jsoup.parser.Parser;

/**
 * @author chenxf
 * @date 4/22/2018
 * @description
 */
public class CutHtml {

  public static void main(String[] args) {
    String htmlCon = "<style>.adff{float:left;}</style><p>aaaaaaaaaaaaaaaaaabb</p><p>cccccccccccc</p>";

    System.out.println(cutPrettyHtmlString(htmlCon, 10, false));

  }

  /**
   * 截取指定长度的html字符串,标签闭合,采用Jsoup解析
   * @param str 待处理的html字符串
   * @param num 需要截取的长度
   * @param isImgEnable 是否剔除图片,因为一般摘要不显示图,如果不需要就用false,摘要需要图就用true
   * @return 处理过的字符串
   */
  public static String cutPrettyHtmlString(String str, int num,
      boolean isImgEnable) {

    String returnStr = "";
    int remainNum = num;

    Document doc = Jsoup.parse(str, "", Parser.xmlParser());

    List<Node> nodes = doc.childNodes();

    Node node = null;
    String tempStr = null;
    List<Node> tempNodes;
    Element tempNode = null;
    String tempStartTagString;
    String tempEndTagString;
    String tempTagString;
    String tempTagChildString;
    String tempCutStr;
    for (Iterator<Node> iterator = nodes.iterator(); iterator.hasNext(); ) {
      node = iterator.next();

// 如果是文本节点,则直接拼接文本字符串
      if (node instanceof TextNode) {
// node存在肯定不会为null
        tempStr = node.toString().trim();
        if (tempStr.length() < remainNum) {
// 如果当前文本小于需要截取的长度,则全部拼接
          returnStr += tempStr;
        } else {
// 如果大于或等于截取的长度,则只截取remainNum的长度
          returnStr += tempStr.substring(0, remainNum);
        }
// 更新剩余截取任务量
        remainNum -= tempStr.length();
      } else {
        tempNodes = node.childNodes();
        if (tempNodes == null || tempNodes.size() == 0) {
// 说明是直接闭合的元素节点,如<br/>、<img>等等,应该不占字符长度原样拼接
          if (!isImgEnable && node.nodeName().equalsIgnoreCase("img")) {
// 如图摘要不含图片,应把图片剔除
            continue;
          }
          returnStr += node.toString();
        } else {
// 如果是style标签,应该原样输出
          if (node.nodeName().equalsIgnoreCase("style")) {
            returnStr += node.toString();
            continue;
          }
// 如果是一般含子元素的元素节点,把自身元素标签部分拼接,对子元素则递归拼接
// 深拷贝,为的是排除子节点,获取自身文本
// <p align='center'><strong>tttttttt</strong></p>---><p
// align='center'>递归(<strong>tttttttt</strong>)</p>
          tempNode = (Element) node.clone();
          tempTagChildString = tempNode.html();
          tempNode.empty();
          tempEndTagString = "</" + tempNode.tagName() + ">";
          tempTagString = tempNode.toString();
          tempStartTagString = tempTagString.substring(0,
              tempTagString.indexOf(tempEndTagString));
          returnStr += tempStartTagString;
          tempCutStr = cutPrettyHtmlString(tempTagChildString,
              remainNum, isImgEnable);
          returnStr += tempCutStr;
          remainNum -= tempCutStr.length();
          returnStr += tempEndTagString;
        }

      }

      if (remainNum <= 0) {
// 跳出递归条件,即剩余任务为0
        break;
      }

    }
    return returnStr;
  }
}
